#include <cstdlib>
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
//#include <sys/types.h>
//#include <sys/wait.h>
#include <fstream>
#include "Terminos.h"
#include "StringManager.h"
#include "MatrixA.h"
#include "MatrixSVD.h"
#include "ExecuteCommand.h"

//#include "GenerarFrecuencias.h"
long gCantDocumentos=0;

using namespace std;

#define BUZZ_SIZE 1024
#define  MAX_DOC_IN_MEMORY 0
#pragma GCC diagnostic ignored "-Wwrite-strings"
/* Execute the command using this shell program.  */
//#define SHELL "/bin/bash"

/*Esto es para esperar a que se termine de ejecutar el scrip de unix antes de seguir con el programa*/
/*
int my_system (const char *command)
{
  int status;
  pid_t pid;

  pid = fork ();
  if (pid == 0)
    {
      execl (SHELL, SHELL, "-c", command, NULL);
      _exit (EXIT_FAILURE);
    }
  else if (pid < 0)
    status = -1;
  else
    if (waitpid (pid, &status, 0) != pid)
      status = -1;
  return status;
}
*/
void procesarDocumentos(string repositorio)
{
    Terminos terminos;
    string line,lineaDoc;
    string pathToDocs="./Archivos/"+repositorio+"/Documentos.txt";
    ifstream myfile (pathToDocs.c_str());
    ifstream myDocs;
    string palabra;
    long NUmDoc=0;
    terminos.setCurrentDoc(NUmDoc);
   /***********************************************************************/
   /*     Define los terminos que existen en todos los documentos         */ 
   /***********************************************************************/
	system("echo `date`: inicio gen >> tiempo.txt ");
    if (myfile.is_open())
	   {
	     while ( myfile.good() )//Lee lista de Docs
	     {
	    	 //cout <<"Generando Terminos: " <<line<<endl;
	       getline (myfile,line);
	       myDocs.open(line.c_str());
	       if (myDocs.is_open())//Lee cada Doc
	   	   {
	   	     while ( myDocs.good() )
	   	     {
				getline (myDocs,lineaDoc);
				terminos.ProsesarTerminosFull(lineaDoc);
				//terminos.ProsesarTerminos(lineaDoc,"Crear");
	   	     }
	   	   }// FIn lee Doc
           myDocs.close();
           NUmDoc++;
           if((NUmDoc >= MAX_DOC_IN_MEMORY ) && (line[0]=='/'))
           {
        	   string file_name="./fileAux/";
        	   file_name+=StringManager::int2string(gCantDocumentos);
        	   file_name+=".aux.frec";
        	   terminos.guardarTerminosYFrecs(file_name);
        	   gCantDocumentos++;
        	   NUmDoc=-1;
           }
           else
        	   if (line[0]!='/')
        	   		NUmDoc=-1;
           
	     }
	     myfile.close();
	     if( NUmDoc != -1 )
         {
      	   string file_name="./fileAux/";
      	   file_name+=StringManager::int2string(gCantDocumentos);
      	   file_name+=".aux.frec";
      	   terminos.guardarTerminosYFrecs(file_name);
      	   gCantDocumentos++;
         }
	   }// Fin Lee Archivos
	system("echo `date`: End gen >> tiempo.txt ");
     /***********************************************************************/
    /*     Guarda Los terminos en el archivo y en memoria                  */
    /***********************************************************************/
	terminos.guardarTerminos("./Archivos/"+repositorio+"/palabras.txt");

    /***********************************************************************/
    /*     Calculo frecuencias de terminos por documento                   */ 
    /***********************************************************************/
	system("echo `date`: start Calculo frec term >> tiempo.txt ");

    for (long i =0; i < gCantDocumentos; i++){
        string file_name="./fileAux/";
	    file_name+=StringManager::int2string(i);
      	file_name+=".aux.frec";
        terminos.cargarFreqTerminos(file_name);
        string command = "rm "+ file_name;
        ExecuteCommand::my_system(command.c_str());
        file_name="./fileAux/";
	    file_name+=StringManager::int2string(i);
      	file_name+=".frec";
        terminos.guardarEnArchivo(file_name);
    }
	system("echo `date`: end Calculo frec term >> tiempo.txt ");

    /***********************************************************************/
    /*     Calculo frecuencias de terminos por documento                   */ 
    /***********************************************************************/
/*
    myfile.open(pathToDocs.c_str());
	if (myfile.is_open())
	   {
	     while ( myfile.good() )//Lee lista de Docs
	     {
	    	 cout <<"Generando Fecs: " <<line<<endl;
	       getline (myfile,line);
	       myDocs.open(line.c_str());
	       //ContadorPalabras contadorLocal;
	       string palabra;
	       NUmDoc++;
	       terminos.setCurrentDoc(NUmDoc);
	       if (myDocs.is_open())//Lee cada Doc
	   	   {
	   	     while ( myDocs.good() )
	   	     {
	   	    	getline (myDocs,lineaDoc);   
	   	    	terminos.ProsesarTerminos(lineaDoc,"SumaFrec");
	   	     };

	   	   }// FIn lee Doc
           myDocs.close();

           //Chequeo que line[0]==/ porque todos los path valido empieza con /, cualquier otra cosa no es un doc valido.
           if((NUmDoc >= MAX_DOC_IN_MEMORY ) && (line[0]=='/'))
           {
        	   string file_name="./fileAux/";
        	   file_name+=StringManager::int2string(gCantDocumentos);
        	   file_name+=".frec";
        	   terminos.guardarEnArchivo(file_name);
        	   gCantDocumentos++;
        	   NUmDoc=-1;  
           }
           else
        	   if (line[0]!='/')
        	   		NUmDoc=-1;
        	   
	     }
	     myfile.close();
         if( NUmDoc != -1 )
         {
      	   string file_name="./fileAux/";
      	   file_name+=StringManager::int2string(gCantDocumentos);
      	   file_name+=".frec";
      	   terminos.guardarEnArchivo(file_name);
      	   gCantDocumentos++;
         }
      }// Fin Lee Archivos    
*/
}


int main(int argc, char *argv[])
{    

	system("echo `date` : Start program > tiempo.txt ");

	if (argc < 3)
	{
		cout<<"Parametros incorrectos";

	}
	else
	{

		//char path[]="/home/datos/Escritorio/Proyectos/TPLSI/LSI/ArchivosTest/";
		int pAutoValores;
		string auxAutovalor,borrarScript,repositorio,listScript,path ;
		MatrixSVD *svdPRoduct;
		path=argv[3];

		auxAutovalor = argv[2];
		auxAutovalor = auxAutovalor.substr(1);
		pAutoValores=atoi(auxAutovalor.c_str());
		repositorio=argv[1];

		listScript = "./ScriptsUnix/listarArchivos.sh ";
		listScript+=path;
		listScript+=" ";
		listScript+=repositorio;
		borrarScript="./ScriptsUnix/borrar.sh "+repositorio;
		ExecuteCommand::my_system(borrarScript.c_str());
		ExecuteCommand::my_system(listScript.c_str());

		procesarDocumentos(repositorio);
		system("echo `date`: Start gen MatrixA >> tiempo.txt ");
		MatrixA::recompose(gCantDocumentos);
		MatrixA::transform(pAutoValores);
		system("echo `date`: End gen MatrixA  >> tiempo.txt ");
		system("echo `date`: Start SVD >> tiempo.txt ");
		listScript="./ScriptsUnix/SVD.sh ";
		listScript+=StringManager::int2string(pAutoValores);
		listScript+=" ";
		listScript+=repositorio;
		ExecuteCommand::my_system(listScript.c_str());
		ExecuteCommand::my_system("rm ./fileAux/matrizA.txt");
		system("echo `date`: End SVD >> tiempo.txt ");
		system("echo `date`: Start Calc SxT >> tiempo.txt ");
		svdPRoduct = new MatrixSVD(repositorio);
		svdPRoduct->generateTxS(repositorio);
		system("echo `date`: End Calc SXT >> tiempo.txt ");

		delete svdPRoduct;
		ExecuteCommand::my_system("rm ./fileAux/* > /tmp/log.log 2>&1");
		//system("PAUSE");
		return EXIT_SUCCESS;
    
	}
	system("echo `date`: end program >> tiempo.txt ");
	//return -1;
    
}
